package net.ufrog.common.xls.disposer;

import net.ufrog.common.exception.ServiceException;
import org.apache.poi.ss.usermodel.Cell;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 处理器
 * 
 * @author ultrafrog
 * @version 1.0, 2014-08-09
 * @since 1.0
 */
public abstract class Disposer {

    /** 处理器映射 */
    private static Map<Class<?>, Disposer> mDisposer;

    static {
        mDisposer = new HashMap<>();
        mDisposer.put(String.class, new StringDisposer());
        mDisposer.put(Integer.class, new IntDisposer());
        mDisposer.put(BigDecimal.class, new BigDecimalDisposer());
        mDisposer.put(Date.class, new DateDisposer());
    }

    /**
     * 读取数据
     *
     * @param cell 单元格
     * @param annotation 注解
     */
    public abstract Object get(Cell cell, net.ufrog.common.xls.annotation.Cell annotation);

    /**
     * 设置数据
     *
     * @param cell 单元格
     * @param value 内容
     * @param annotation 注解
     */
    public abstract void set(Cell cell, Object value, net.ufrog.common.xls.annotation.Cell annotation);

    /**
     * 读取数据
     *
     * @param cell 单元格
     * @param annotation 注解
     * @param fieldType 字段类型
     * @return 数据结果
     */
    public static Object get(Cell cell, net.ufrog.common.xls.annotation.Cell annotation, Class<?> fieldType) {
        if (!mDisposer.containsKey(fieldType)) {
            throw new ServiceException("cannot dispose type: " + fieldType.getName());
        }
        return mDisposer.get(fieldType).get(cell, annotation);
    }

    /**
     * 设置数据
     *
     * @param cell 单元格
     * @param value 数据
     * @param annotation 注解
     * @param fieldType 字段类型
     */
    public static void set(Cell cell, Object value, net.ufrog.common.xls.annotation.Cell annotation, Class<?> fieldType) {
        if (!mDisposer.containsKey(fieldType)) {
            throw new ServiceException("cannot dispose type: " + fieldType.getName());
        }
        mDisposer.get(fieldType).set(cell, value, annotation);
    }
}
